
#include <GL/gl.h>
#include <math.h>
#include "o_objet.h"
#include "u_table.h"
#include "t_geometrie.h"



struct rond
{
  Table_triplet rond;
  Triplet centre;
  double rayon;
  int nb_points;
} ;


Table_triplet calcul_rond(Triplet centre, double rayon, int nb_points)
{               
 int j;
 Table_triplet liste;
 double theta,pas;
 

   liste.nb = nb_points;
   liste.table = malloc( nb_points*sizeof(Triplet));
   theta = 0.;
   pas = 2*M_PI/nb_points; 
   for (j=0 ; j<nb_points ; j++)
     {
       liste.table[j].x = centre.x + rayon*cos(theta);
       liste.table[j].y = centre.y + rayon*sin(theta);
       liste.table[j].z = centre.z ;
       
       theta += pas;  
     }
    
   return liste;
}

static void changement(struct rond *o)
{ 
  if ( ! (UN_CHAMP_CHANGE(o)||CREATION(o)) )
    return ;

  if (CHAMP_CHANGE(o, centre) ||  CHAMP_CHANGE(o,nb_points) ||
      CHAMP_CHANGE(o, rayon))
    {
      if (o->rond.nb > 0 )
         free(o->rond.table);

      if (o->nb_points < 2)
          o->nb_points = 10;
  
      o->rond = calcul_rond(o->centre,o->rayon,o->nb_points);  
      printf("dans changement\n");
    }
  
   
}


static void affiche_rond(struct rond *o)
{
  int j;

  glBegin(GL_LINE_LOOP) ;

  for(j=0  ; j<o->rond.nb ; j++)
    glVertex3f(o->rond.table[j].x,o->rond.table[j].y,o->rond.table[j].z); 
    
  glEnd();
}


CLASSE(rond, struct rond,
       
       // CHAMP(rond, L_table_point P_table_triplet 
       //           Sauve)
       CHAMP(nb_points, LABEL("Nombre de points") 
             L_entier Affiche Edite Sauve DEFAUT("10") )
       
       CHAMP(centre,L_triplet Extrait Obligatoire  Edite)
       CHAMP(rayon, L_flottant Extrait Obligatoire Edite DEFAUT("1"))       
       
       CHANGEMENT(changement)
       CHAMP_VIRTUEL(L_affiche_gl(affiche_rond))
        
       MENU("Exemples_MG/rond")
       EVENEMENT("Shift+RD")
       )
